package javaCode.chapter12.arrays_;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @author 徐州城
 * @version 1.0
 */
public class ArraysMethod01 {
    public static void main(String[] args) {
        Integer[] integers = {1,20,40};
        //遍历数组  可以直接使用Arrays.toString，显示数组
        System.out.println(Arrays.toString(integers));

        //sort 方法的使用
        Integer[] arr = {1,0,20,9};
        //排序
        //1. 可以直接使用冒泡排序，也可以直接使用Arrays提供的sort方法排序
        //2. 因为数组是引用类型，所以通过sort排序后，会直接影响到 实参 arr
        //3. sort重载的，也可以通过传入一个接口 Comparator 实现定制排序
        //4. 调用 定制排序时，传入两个参数 (1) 排序的数组 arr
        //   (2) 实现了Comparator 接口匿名内部类，要求实现 comparator方法
        //5. 先演示效果
        //6. 这里体现了接口编程的方式，看源码就会明白
        //  源码分析
        //(1) Arrays.sort(arr, new Comparator())
        //(2) 最终到 TimSort类的 private static <T> void binarySort(T[] a,int lo, int hi, Comparator<? super T> c)()
        //(3) 执行到 binarySort方法的代码，会根据动态绑定机制 c.compare() 执行到我们传入的匿名内部类的 c.compare()
        //  while (left < right) {
        //          int mid = (left + right) >>> 1;
        //              if (c.compare(pivot, a[mid]) < 0)
        //                  right = mid;
        //              else
        //                  left = mid + 1;
        //              }
        //(4) new Comparator() {
        //            @Override
        //            public int compare(Object o1, Object o2) {
        //                Integer i1 = (Integer) o1;
        //                Integer i2 = (Integer) o2;
        //                return i1 - i2;
        //            }
        //        }
        //(5) public int compare(Object o1, Object 02) 返回的值>0 还是 <0
        //    会影响整个排序结果，这就充分体现了 接口编程 + 动态绑定 + 匿名内部类的综合使用
        //    将来的底层框架和源码的使用方式，会非常的常见
        //

        //Arrays.sort(arr); //默认排序
        //定制排序
        Arrays.sort(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Integer i1 = (Integer) o1;
                Integer i2 = (Integer) o2;
                return i1 - i2;
            }
        });
        System.out.println(Arrays.toString(arr));
    }
}
